package com.agile.leetcode.circle;

/**
 * @Author ChenZhangKun
 * @Date 2020/5/19 10:27
 */

import java.util.*;

/**
 * 给你两个整数 n 和 start。你的任务是返回任意 (0,1,2,,...,2^n-1) 的排列 p，并且满足：
 *
 *     p[0] = start
 *     p[i] 和 p[i+1] 的二进制表示形式只有一位不同
 *     p[0] 和 p[2^n -1] 的二进制表示形式也只有一位不同
 *
 *
 *
 * 示例 1：
 *
 * 输入：n = 2, start = 3
 * 输出：[3,2,0,1]
 * 解释：这个排列的二进制表示是 (11,10,00,01)
 *      所有的相邻元素都有一位是不同的，另一个有效的排列是 [3,1,0,2]
 *
 * 示例 2：
 *
 * 输出：n = 3, start = 2
 * 输出：[2,6,7,5,4,0,1,3]
 * 解释：这个排列的二进制表示是 (010,110,111,101,100,000,001,011)
 *
 */
public class Solution {
    public static void main(String[] args) {
        Caculatr c=new Caculatr();
        String regex = c.getRegex(0,3);
        System.out.println(regex);
    }
}
class Caculatr{
    /**
     * 返回一个数的二进制
     * @param n
     * @return
     */
    public String getRegex(int n,int length){
        if (n<0) return null;
        int num=n;
        StringBuilder builder=new StringBuilder();
        Stack stack=new Stack();
        int result;
        while (num>0){
            result=num%2==0?0:1;
            stack.push(result);
            num=num/2;
        }
        while (stack.size()<length){
            stack.push(0);
        }
        while (stack!=null&&stack.size()>0){
            builder.append(stack.pop());
        }
        return builder.toString();
    }
    public int[] getResult(int n,int start){
        String regex = getRegex(start,n);
        // 计算2^n-1
        int i=(int) Math.pow(2,n);
        //
        List<Integer> list1=new ArrayList<>();
        list1.add(start);
        int[] ints=new int[i];
        ints[0]=start;
        // 找出相差一位的数
        List<Integer> list=new ArrayList<>();
        Map<Integer,String> map=new HashMap<>();
        for (int j = 0; j < i; j++) {
            if (j==start) continue;
            String regex1 = getRegex(j,n);
            map.put(j,regex1);
            boolean result = getResult(regex, regex1);
            if (result) list.add(j);
        }
        // 固定最后一位
        while (true) {

        }

    }
    public boolean getResult(String s1,String s2){
        int count=0;
        int length = s1.length();
        for (int i = 0; i <length ; i++) {
            if (s1.charAt(i)==s2.charAt(i)) count++;
            if (count>1) return false;
        }
        return true;
    }
    public int getMap(String s,Map<Integer,String> map){
        for (int i = 0; i <map.size() ; i++) {
            if (getResult(s,map.get(i))) return i;
        }
        return -1;
    }
}
